﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Collections;
using System.Transactions;

#region Percurso
namespace Distrackting.DataLayer
{
    public partial class Percurso
    {
        public void setPercurso(Percurso per)
        {
            this.cod_percurso = per.cod_percurso;
            this.descarregado = per.descarregado;
            this.nome = per.nome;
            this.cod_partida = per.cod_partida;
            this.distancia = per.distancia;
            this.duracao = per.duracao;
            this.cod_epoca = per.cod_epoca;
            this.cod_ambito = per.cod_ambito;
            this.cod_desnivel = per.cod_desnivel;
            this.cod_chegada = per.cod_chegada;
            this.cod_entidade = per.cod_entidade;
            this.cod_estado = per.cod_estado;
            this.cod_dificuldade = per.cod_dificuldade;
            this.cod_tipo = per.cod_tipo;
            this.descricao = per.descricao;
            this.data = per.data;
            this.rating_total = per.rating_total;
            this.cod_utilizador = per.cod_utilizador;
        }
    }
}
#endregion

#region dataPercurso
namespace Distrackting.DataLayer
{
    public class dataPercurso
    {
        #region Methods
        public static Guid createPercurso(Percurso p, List<Ponto> lista_pt)
        {
            dbDataDataContext dbData = new dbDataDataContext();
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                        p.cod_percurso = System.Guid.NewGuid();
                        dbData.Percursos.InsertOnSubmit(p);

                        if (lista_pt != null)
                        {
                            foreach (Ponto ponto in lista_pt)
                            {
                                ponto.cod_ponto = System.Guid.NewGuid();
                                ponto.cod_percurso = p.cod_percurso;
                            }

                            dbData.Pontos.InsertAllOnSubmit(lista_pt);
                        }
                    

                    dbData.SubmitChanges();
                    scope.Complete();
                return p.cod_percurso;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }


        public static Percurso getPercurso(Guid cod_percurso)
        {
            try
            {
                if (cod_percurso == null)
                    return null;
                dbDataDataContext dbData = new dbDataDataContext();
                Percurso per = (from p in dbData.Percursos
                                  where p.cod_percurso == cod_percurso
                                  select p).FirstOrDefault();
                return per;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Boolean changePercurso(Percurso p)
        {
            try
            {
                if (p == null)
                    return false;
                else
                {
                    dbDataDataContext dbData = new dbDataDataContext();
                    Percurso res = getPercurso(p.cod_percurso);
                    if (res == null) return false;
                    else
                    {
                        res.setPercurso(p);
                        dbData.SubmitChanges();
                        return true;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IQueryable<Percurso> getPercursos()
        {
            try
            {
                dbDataDataContext dbData = new dbDataDataContext();
                return dbData.Percursos;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IQueryable<Percurso> getPercursos(Expression<Func<Percurso, bool>> whereClause)
        {
            try
            {
                dbDataDataContext dbData = new dbDataDataContext();
                return dbData.Percursos.Where(whereClause);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Boolean deletePercurso(Percurso per)
        {
            try
            {
                dbDataDataContext dbData = new dbDataDataContext();
                if (dbData.Percursos.Contains(per))
                {
                    Percurso res = (from p in dbData.Percursos
                                      where p.cod_percurso == per.cod_percurso
                                      select p).FirstOrDefault();
                    if (res == null)
                        return false;
                    else
                    {
                        dbData.Percursos.DeleteOnSubmit(per);
                        dbData.SubmitChanges();
                        return true;
                    }
                }
                else return false;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int contarPercursos()
        {
            dbDataDataContext dbData = new dbDataDataContext();
            try
            {
                return dbData.Percursos.Count();
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        #endregion
    }
        
}
#endregion